// import store from '../store';
import http from 'axios';
import NProgress from 'nprogress'; // 引入 NProgress
import 'nprogress/nprogress.css'; // 引入 NProgress 的 CSS

import {ElMessage} from "element-plus";
// import message from "@element-plus/icons-vue/dist/es/message.mjs";

//import message from './network/message';
const root = '/api';
const upRoot = '/up';

const downRoot = "/down"
// 测试
//var root = process.env.NODE_ENV === "development"? '/json':'http://10.10.10.155/smpw';

//var root = 'https://testweb.datasw.cn';


let cancelToken = http.CancelToken;//初始化取消请求的构造函数
let removePending = (config, f) => {
    // if(config.data.bizContent) {
    //     var file = config.data.filename
    //     var a = file.split('_')
    //     a.pop();
    //     var flagUrl = a.join('_')
    //     console.log(flagUrl, '2222');
    // }else {
    //     var file1 = JSON.parse(config.data).filename
    //     var b= file1.split('_')
    //     b.pop();
    //     var flagUrl = b.join('_')
    //     console.log(flagUrl, '33333');
    // }
    // if(pending.indexOf(flagUrl)!==-1){
    //     if(f){
    //         f()
    //         store.commit('set_loading', false);
    //     }else{
    //         pending.splice(pending.indexOf(flagUrl), 1)
    //     }
    // }else{
    //     if(f){
    //         pending.push(flagUrl)
    //     }
    // }

}

// 封装 axios
function apiAxios(method, url, params, success, resType, upload) {
    return new Promise((resolve, reject) => {
        http({
            // `url` 是用于请求的服务器 URL
            url: url,

            // `method` 是创建请求时使用的方法
            method: method, // 默认是 get

            // `baseURL` 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL。
            // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
            baseURL: upload ? upRoot : root,
            // baseURL:  baseUrl,
            // `params` 是即将与请求一起发送的 URL 参数
            // 必须是一个无格式对象(plain object)或 URLSearchParams 对象
            params: method === 'GET' || method === 'DELETE' ? params : null,
            responseType: resType,
            // `data` 是作为请求主体被发送的数据
            // 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
            // 在没有设置 `transformRequest` 时，必须是以下类型之一：
            // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
            // - 浏览器专属：FormData, File, Blob
            // - Node 专属： Stream
            data: method === 'POST' || method === 'PUT' ? params : null,
            withCredentials: false,  // cookie
            headers: {
                'Content-Type': 'application/json;charset:utf-8;', // 请求头

            }
        }).then(function (res) {
            // 成功时回调
            if (success) {
                if (resType == "blob" || res.config.url.indexOf("/log") > -1) {
                    success(res)
                } else {
                    success(res.data);
                }
            } else {
                resolve(res.data);
            }
            // return success

        }).catch(function (err) {
            // 异常时回调
            //   message.warning('网络连接失败, 请检查网络......');
            console.log(err)
            reject(err);
            // return false;
        });
    });
}

http.interceptors.request.use(
    config => {
        // if(config.method==='post'){
        //     config.cancelToken = new cancelToken((c)=>{
        //         removePending(config,c);
        //     });
        // }
        // if (_this.$cookie.get('openId_qtuc')) {
        //         config.headers['Open-Id'] = _this.$cookie.get('openId_qtuc')
        // }
        // if (vueCookie.get('openId_qtuc') === 'null') {
        //     vueCookie.set("openId_qtuc","b481386adf0544968b78103a8dbe0c31")
        //     out()
        //     return false;
        // }
        // if(_this.$cookie.get('accessToken_qtuc')) {
        //     config.headers['Access-Token'] = _this.$cookie.get('accessToken_qtuc')
        // }
        // store.commit('set_loading', true);
        // 该处可以将config打印出来看一下，该部分将发送给后端（server端）
        config.url = config.url.replace("//", '/')
        console.log(config)
        if (config.baseURL.startsWith("/up")) {
            config.headers['Content-Type'] = 'multipart/form-data'
        }

        if (config.url != "/login") {
            config.headers['token'] = sessionStorage.getItem("token")
        }
        NProgress.start();
        return config  // 对config处理完后返回，下一步将向后端发送请求
    },
    error => {  // 当发生错误时，执行该部分代码
        return Promise.reject(error)
    }
)

function out() {
    // var url = api.SSO_LOGINURL+'?appId='+api.APPID+'&redirectUri='+api.SSO_REDIRECTURI;
    // MessageBox.confirm('登陆状态失效，请重新登录！', '提示', {
    //     confirmButtonText: '确定',
    //     cancelButtonText: '取消',
    //     type: 'warning'
    // }).then(() => {
    //
    //     window.location.replace(url)
    // }).catch(() => {
    //     window.location.replace(url)
    //     return false
    // });
}

//响应拦截（配置请求回来的信息）
http.interceptors.response.use(function (response) {
        NProgress.done();
        // 处理响应数据
        if (response.config.method === 'post') {

        }
        let token = response.headers.token;
        if (response.data.code == 1005) {
            ElMessage.warning('登录已过期......');
            sessionStorage.clear()
        }
        if (token != undefined && sessionStorage.getItem("token") == undefined) {
            sessionStorage.setItem("token", token);
        }
        // store.commit('set_loading', false);
        return response
    },
    function (error) {
        NProgress.done();
        // 处理响应失败
        if (error && error.response) {
            // 关闭loading
            // store.commit('set_loading', false);
            switch (error.response.status) {
                case 400:
                    ElMessage.warning('错误请求....');
                    break
                case 401:
                    ElMessage.warning('未授权，请重新登录(401)......');
                    break;
                case 403:
                    ElMessage.warning('拒绝访问(403)......');
                    break;
                case 408:
                    ElMessage.warning('请求超时(408)......');
                    break;
                case 404:
                    ElMessage.warning('请求错误，未找到资源股......');
                    break
                case 500:
                    ElMessage.warning('服务器出错，无法完成请求....');
                    break
                case 502:
                    ElMessage.warning('网络出错......');
                    break
                case 501:
                    ElMessage.warning('服务未实现(501)......');
                    break;
                case 503:
                    ElMessage.warning('服务不可用......');
                    break
                case 504:
                    ElMessage.warning('网络超时......');
                    break
                case 505:
                    ElMessage.warning('HTTP版本不受支持(505)......');
                    break;
                default:
                    ElMessage.warning('连接出错......');
            }
        }
        return Promise.reject(error)
    })
// 返回在vue模板中的调用接口
export default {
    // 查询
    get: function (url, params, success) {
        return apiAxios('GET', url, params, success, "json");
    },
    // 修改
    post: function (url, params, success) {

        return apiAxios('POST', url, params, success, "json");
    },
    // 更新
    put: function (url, params, success) {
        return apiAxios('PUT', url, params, success, "json");
    },
    // 上传
    upload: function (url, params, success) {
        return apiAxios('POST', url, params, success, "json", true);
    },
    //下载接口
    downloadFile: function (url, params, success) {
        return apiAxios('GET', url, params, success, 'blob');
    },
}
